﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraBars;
using LayerEntity.Almacen;
using System.Collections;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraEditors;
using LayerEntity.Sistema;

namespace System2012.Almacen
{
    public partial class fmIngSeriesProducts : DevExpress.XtraEditors.XtraForm
    {
       public DataTable Series = new DataTable("Series");
        List<ESeriesProd> list = new List<ESeriesProd>();
        int Row=-1;
        /// <summary>
        /// CantReq, numero de elementos requeridos
        /// </summary>
        double CantReq;
        
        /// <summary>
        /// op: 
        /// 0: cuando es nuevo registor
        /// 1:cuando es un se esta actualizando un registro en la lista
        /// </summary>
        int op=0;
        /// <summary>
        /// opReg: confirma que si los datos que se an ingresados son correctamente
        /// </summary>
        int opReg = 0;
        public fmIngSeriesProducts()
        {
            InitializeComponent();
           CabSeries();
          // ESeriesProd serie= new ESeriesProd ();
           //list.Add(serie);
           gridControl1.DataSource = Series;
            
        }
        public fmIngSeriesProducts(DataTable oldSeries,ArrayList data)
        {
            InitializeComponent();
            InitEvents();
            CabSeries();
            CantReq = double.Parse(data[1].ToString());
            txtCantReq.Text = CantReq.ToString();
            txtProducto.Text = data[0].ToString();
            ESeriesProd serie = new ESeriesProd();
            list.Add(serie);
            AddSeries(oldSeries);
           // this.Series = dtbSerie;
            gridControl1.DataSource = Series;
            RecControles(this);
        }

        #region Series
        /// <summary>
        /// CabSeries: Generamos la estructura de la cabecera de la grilla
        /// </summary>
        private void CabSeries()
        {
            DataColumn item;

            item = new DataColumn();
            item.DataType = System.Type.GetType("System.String");
            item.ColumnName = "Item";
            item.ReadOnly = true;
            item.Unique = true;
            item.AutoIncrement = true;
            item.AutoIncrementStep = 1;
            item.AutoIncrementSeed = 1;
            Series.Columns.Add(item);
            Series.Columns.Add(new DataColumn("Nro_Chasis", typeof(string)));
            Series.Columns.Add(new DataColumn("Nro_Motor", typeof(string)));
            Series.Columns.Add(new DataColumn("Anio_Modelo", typeof(string)));
            Series.Columns.Add(new DataColumn("Anio_Fabrica", typeof(string)));
        }
        /// <summary>
        /// AddSeries: Registra las series que han sido ingresadas anteriormente
        /// </summary>
        /// <param name="copySeries"></param>
        private void AddSeries(DataTable copySeries)
        {
            foreach (DataRow row in copySeries.Rows)
            {

                DataRow rSer = Series.NewRow();
                rSer["Nro_Chasis"] = row["Nro_Chasis"];
                rSer["Nro_Motor"] = row["Nro_Motor"];
                rSer["Anio_Modelo"] = row["Anio_Modelo"];
                rSer["Anio_Fabrica"] = row["Anio_Fabrica"];
                Series.Rows.Add(rSer);

            }
            
        }
        /// <summary>
        /// AddRegSeries: permite agregar registros segun la cantidad de nro  de series se quiere ingresa 
        /// para el producto seleccionado
        /// </summary>
        /// <param name="cantLine"></param>
        private void AddRegSeries()
        {
            if (ValidateText())
            {
                if (ValidateRegs())
                {
                    if (ValidateRegsDataBase())
                    {

                        DataRow rSer = Series.NewRow();
                        rSer["Nro_Chasis"] = txtChasis.Text; ;
                        rSer["Nro_Motor"] = txtMotor.Text; ;
                        rSer["Anio_Modelo"] = txtAnioModelo.Text;
                        rSer["Anio_Fabrica"] = txtAnioFabrica.Text;
                        Series.Rows.Add(rSer);
                        countIngRegs();
                        NewDocument();
                    }
                }
            }
            
        }
        private bool ValidateIngReg()
        {
            bool res = true;
            if (double.Parse(txtCantReq.Text) < double.Parse(txtCantIng.Text))
            {
                res = false;
                XtraMessageBox.Show(this, "La cantidad de series requeridas \n"+
                " se han ingresado en su totalidad", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            return res;
        }
        private bool ValidateRegs()
        {
            bool res = true;
            if (!VeryExistsRegsModel("Nro_Chasis", txtChasis.Text))
            {
                res = false;
                XtraMessageBox.Show(this, "Nro de Chasis ya existe  ", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtChasis.Focus();
                txtChasis.SelectAll();
            }
            else
            {
                if (!VeryExistsRegsModel("Nro_Motor", txtMotor.Text))
                {
                    res = false;
                    XtraMessageBox.Show(this, "Nro de Motor ya existe  ", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    txtMotor.Focus();
                    txtMotor.SelectAll();
                }
            }
            return res;
        }
        private bool ValidateRegsDataBase()
        {
            bool res = true;
            if (!VeryExistDataBase(1))
            {
                res = false;
                XtraMessageBox.Show(this, "Nro de Chasis ya esta registrado  ", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtChasis.Focus();
                txtChasis.SelectAll();
            }
            else
            {
                if (!VeryExistDataBase(2))
                {
                    res = false;
                    XtraMessageBox.Show(this, "Nro de Motor ya esta registrado  ", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    txtMotor.Focus();
                    txtMotor.SelectAll();
                }
            }
            return res;
        }
        private bool ValidateText()
        {
            bool res = true;
            if (string.IsNullOrEmpty(txtChasis.Text))
            {
                res = false;
                XtraMessageBox.Show(this, "Ingrese el nro de Chasis  ", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtChasis.Focus();
                txtChasis.SelectAll();
            }
            else
            {
                if (string.IsNullOrEmpty(txtMotor.Text))
                {
                    res = false;
                    XtraMessageBox.Show(this, "Ingrese el nro de Chasis  ", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    txtMotor.Focus();
                    txtMotor.SelectAll();
                }
                else
                {
                    if (string.IsNullOrEmpty(txtAnioModelo.Text))
                    {
                        res = false;
                        XtraMessageBox.Show(this, "Ingrese el Año Modelo  ", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        txtAnioModelo.Focus();
                        txtAnioModelo.SelectAll();
                    }
                    else
                    {
                        if (string.IsNullOrEmpty(txtAnioFabrica.Text))
                        {
                            res = false;
                            XtraMessageBox.Show(this, "Ingrese el Año de Fabricacion  ", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            txtAnioFabrica.Focus();
                            txtAnioFabrica.SelectAll();
                        }
                    }
                }
            }
            return res;
        }
        /// <summary>
        /// Suma todos los registros que se an ingresados
        /// tomando como campo de control el nro de motor de la grilla
        /// </summary>
        private void countIngRegs()
        {
            int cantIng = 0;    
            foreach (DataRow item in Series.Rows)
            {
                if (!string.IsNullOrEmpty(item["Nro_Motor"].ToString()))
                {
                    cantIng += 1;
                }
            }
            txtCantIng.Text = cantIng.ToString();
        }
        private bool VeryExistsRegsModel(string col_name,string reg)
        {
            bool res = true;
            for (int i = 0; i < Series.Rows.Count; i++)
            {
                if (reg.ToUpper().Equals(Series.Rows[i][col_name]))
                {
                    res = false;
                }
            }
            
            
            return res;
        }
        private bool VeryExistDataBase(int op)
        {
            DataTable dtbSeries;
            bool res = true;
            StringBuilder cadena = new StringBuilder();

            if (op == 1)
            {
                ESistema obj = new ESistema();
                cadena.Append("where nro_chasis='");
                cadena.Append(txtChasis.Text + "'");
                obj.Condicion = cadena.ToString();
                dtbSeries = System2012.SystemUtils.RecordmanagerAlmacen.GetListaSeriesProducts(obj);
                if (dtbSeries.Rows.Count > 0)
                {
                    res = false; 
                }
            }
            if (op == 2)
            {
                ESistema obj = new ESistema();
                cadena.Append("where nro_motor='");
                cadena.Append(txtMotor.Text + "'");
                obj.Condicion = cadena.ToString();
                dtbSeries = System2012.SystemUtils.RecordmanagerAlmacen.GetListaSeriesProducts(obj);
                if (dtbSeries.Rows.Count > 0)
                {
                    res = false;
                }
            }
            return res;
        }
        private void EditRegs(int index)
        {
            if (Row >= 0)
            {
                txtChasis.Text = Series.Rows[index]["Nro_Chasis"].ToString();
                txtMotor.Text = Series.Rows[index]["Nro_Motor"].ToString();
                txtAnioModelo.Text = Series.Rows[index]["Anio_Modelo"].ToString();
                txtAnioFabrica.Text = Series.Rows[index]["Anio_Fabrica"].ToString();
                op = 1;
            }
        }
        private void UpdateRegs(int index){
            if (ValidateText())
            {
                if (ValidateRegs())
                {
                    if (ValidateRegsDataBase())
                    {
                        this.gridView1.SetRowCellValue(index, "Nro_Chasis", txtChasis.Text);
                        this.gridView1.SetRowCellValue(index, "Nro_Motor", txtMotor.Text);
                        this.gridView1.SetRowCellValue(index, "Anio_Modelo", txtAnioModelo.Text);
                        this.gridView1.SetRowCellValue(index, "Anio_Fabrica", txtAnioFabrica.Text);
                        NewDocument();
                    }
                }
            }
        }
        private void NewDocument()
        {
            txtChasis.Text = "";
            txtMotor.Text = "";
            txtAnioFabrica.Text = "";
            txtAnioModelo.Text = "";
            txtChasis.Focus();
            op = 0;
        }
        private void QuitarItem()
        {
            if (this.Series.Rows.Count > 0)
            {
                if (this.Row >= 0)
                {
                    DataView dv = new DataView();
                    dv.Table = this.Series;
                    dv.RowFilter = string.Format("Item={0}", this.Series.Rows[this.Row]["Item"]);// DgvLista["Item", DgvLista.CurrentCell.RowIndex].Value;
                    for (int i = 0; i <= dv.Count - 1; i++)
                    {
                        dv.Delete(i);
                        NewDocument();
                    }
                }
                else
                {
                    XtraMessageBox.Show(this, "SELECIONE UN REGISTRO  DE LA LISTA \n QUE DESEA ELIMINAR", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                XtraMessageBox.Show(this, "NO EXISTE NINGUN REGISTROS  ", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        public  DataTable DistinctRows(DataTable tb, string ColumnName)
        {
            DataTable shortTable = null; //tabla que se regresara
            string val = "";  //variable filtro
            shortTable = new DataTable(); // Inicializa nueva tabla
            try
            {
                shortTable = tb.Clone(); // Clona tabla Source

                shortTable.ImportRow(tb.Rows[0]);//Agrega el primer registro

                val = shortTable.Rows[0][ColumnName].ToString(); //agrega valor filtro a la variable

                foreach (DataRow dr in tb.Rows)
                {
                    if (val != dr[ColumnName].ToString()) //Compara contenido del registro, si son iguales los descarata sino agrega registro a la nueva tabla
                    {
                        shortTable.ImportRow(dr); //importa Registro a la nueva tabla
                    }

                    val = dr[ColumnName].ToString(); //Siguiente valor del filtro
                }

                return shortTable; //Regresa nueva tabla
            }
            catch (Exception ex)
            {
                return null;
            }
        }

        #endregion
        #region Eventos
        private void CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
        {
            GridView view = sender as GridView;
            if (e.Column.FieldName == "Nro_Motor")
            {
               /* string Nro_Motor = view.GetRowCellValue(e.RowHandle, "Nro_Motor").ToString();
                if (!VeryExistsSerieModel(Nro_Motor))
                {
                    XtraMessageBox.Show(this, "Nro Serie ya esta en la Lista", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    view.SetRowCellValue(e.RowHandle, "Nro_Motor", null);
                }*/
            }
        }
        private void chasisKeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
            {
                if (sender == this.txtChasis)
                {
                    if (!VeryExistsRegsModel("Nro_Chasis", txtChasis.Text))
                    {
                        XtraMessageBox.Show(this, "Nro de Chasis ya existe en la Lista  ", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        txtChasis.Focus();
                        txtChasis.SelectAll();
                        return;
                    }
                    else
                    {
                        if (!VeryExistDataBase(1))
                        {
                            XtraMessageBox.Show(this, "Nro de Chasis ya esta registrado  ", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            txtChasis.Focus();
                            txtChasis.SelectAll();
                        }
                    }
                }
                if (sender == this.txtMotor)
                {
                    if (!VeryExistsRegsModel("Nro_Motor", txtMotor.Text))
                    {
                        XtraMessageBox.Show(this, "Nro de Motor ya existe en la Lista  ", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        txtMotor.Focus();
                        txtMotor.SelectAll();
                        return;
                    }
                    else
                    {
                        if (!VeryExistDataBase(2))
                        {
                            XtraMessageBox.Show(this, "Nro de Motor ya esta registrado  ", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            txtMotor.Focus();
                            txtMotor.SelectAll();
                        }
                    }
                }
            }
        }
        private void InitEvents()
        {
            this.gridView1.CellValueChanged += new DevExpress.XtraGrid.Views.Base.CellValueChangedEventHandler(CellValueChanged);
            txtChasis.KeyPress += new KeyPressEventHandler(this.chasisKeyPress);
            txtMotor.KeyPress += new KeyPressEventHandler(this.chasisKeyPress);
        }
        #endregion
        #region Desplazamientos
        private void PresionadoTeclas(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Down)
            {
                if (sender == this.txtChasis)
                {
                    this.txtMotor.Focus();
                    this.txtMotor.SelectAll();
                }
                if (sender == this.txtMotor)
                {
                    this.txtAnioModelo.Focus();
                    this.txtAnioModelo.SelectAll();
                }
                if (sender == this.txtAnioModelo)
                {
                    this.txtAnioFabrica.Focus();
                    this.txtAnioFabrica.SelectAll();
                }
                
            }

            if (e.KeyCode == Keys.Up)
            {
                if (sender ==txtMotor)
                {
                    this.txtChasis.Focus();
                    this.txtChasis.SelectAll();
                }
                if (sender ==txtAnioModelo )
                {
                    this.txtMotor.Focus();
                    this.txtMotor.SelectAll();
                }
                if (sender ==txtAnioFabrica )
                {
                    this.txtAnioModelo.Focus();
                    this.txtAnioModelo.SelectAll();
                }
            }
        }
        public void RecControles(Control control)
        {
            foreach (Control contHijo in control.Controls)
            {
                if (contHijo.HasChildren)
                {
                    this.RecControles(contHijo);
                }
                contHijo.KeyDown += new KeyEventHandler(PresionadoTeclas);
            }
        }
        #endregion
        private void fmIngSeriesProducts_Load(object sender, EventArgs e)
        {

        }

        private void barButtonItem1_ItemClick(object sender, ItemClickEventArgs e)
        {
            opReg = 1;
            this.Close();
        }

        private void gridView1_InitNewRow(object sender, DevExpress.XtraGrid.Views.Grid.InitNewRowEventArgs e)
        {
           
           // gridControl1.DataSource = list;
        }

        private void gridView1_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
            Row = e.FocusedRowHandle;
            if (Row >= 0)
            {
                //sumIngRegs();
            }
        }

        private void txtAnioFabrica_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
            {
                if (op == 0)
                {
                    AddRegSeries();
                }
                if (op == 1)
                {
                    this.UpdateRegs(Row);
                }
            }
        }

        private void gridView1_Click(object sender, EventArgs e)
        {
            if (Row >= 0)
            {
                EditRegs(Row);
            }
        }

        private void fmIngSeriesProducts_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape)
            {
                if (XtraMessageBox.Show(this, "Está seguro que desea Salir \n" +
                        "Confirmación Requerida ?", "Confirmación", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                {
                    this.Close();
                    opReg = 0;
                }
            }
        }

        private void barButtonItem5_ItemClick(object sender, ItemClickEventArgs e)
        {
           
                if (XtraMessageBox.Show(this, "Está seguro que desea Salir \n" +
                        "Confirmación Requerida ?", "Confirmación", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                {
                    this.Close();
                    opReg = 0;
                }
            
        }

        private void fmIngSeriesProducts_FormClosed(object sender, FormClosedEventArgs e)
        {
           
                opReg = 0;
           
        }

        private void barButtonItem2_ItemClick(object sender, ItemClickEventArgs e)
        {
            NewDocument();
        }

        private void fmIngSeriesProducts_Shown(object sender, EventArgs e)
        {
            txtChasis.Focus();
        }

        private void barButtonItem6_ItemClick(object sender, ItemClickEventArgs e)
        {
            if (XtraMessageBox.Show(this, "Está seguro que desea eliminar el registro \n" +
                       "Confirmación Requerida ?", "Confirmación", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                QuitarItem();
            }
        }
    }
}